package com.lbz.common;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.omg.CORBA.TIMEOUT;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 *
 * 使用 Guava Cache单应用运行时的本地缓存，不用把数据存放到文件或者服务器上，简单，
 * 轻量级，也不需要什么配置文件，能覆盖绝大多数使用cache的场景需求。
 *
 * Guava Cache的实现
 *
 * @Author 林必昭
 * @Date 2019/6/18 9:57
 * @Description token本地缓存，使用guava缓存实现
 */

public class TokenCache {

    //创建logback的logger
    private static Logger logger = LoggerFactory.getLogger(TokenCache.class);

    //生成token的前缀
    public static final String TOKEN_PREFIX = "token_";

    //声明一个静态的内存块，guava里面的本地缓存
    public static LoadingCache<String,String> localCache =
            //构建本地缓存，调用链的方式，initialCapacity是缓存的初始化容量，
            // maxSize是缓存设置的最大内存容量，expireAfterAccess设置缓存的有效期为12个小时
            CacheBuilder.newBuilder()
            .initialCapacity(1000)
            .maximumSize(10000)
            .expireAfterAccess(12, TimeUnit.HOURS)
                    //build里面要实现一个匿名内部类
                .build((new CacheLoader<String, String>() {
                    //这个方法是默认的数据加载实现，当get的时候，如果key没有对应的值，就调用这个方法进行加载
                    @Override
                    public String load(String key) throws Exception {
                        //为什么要把return的null值写成字符串，因为到时候用null去.equal的时候，会报空指针异常
                        return "null";
                    }
            }));

    //添加本地缓存
    public static void setKey(String key,String value){
        localCache.put(key,value);
    }

    //得到本地缓存
    public static String getValue(String key){
        String value =null;
        try {
            value = localCache.get(key);
            if ("null".equals(value)){
                return null;
            }
            return value;
        }catch (ExecutionException e){
            logger.error("获取缓存getKey()方法错误",e);
        }
        return null;
    }

}
